import { ResBase } from "@/models/common/resPonse";
import { OpenAPI } from "@/openApi";
import {
  AddRequestInterceptor,
  AddResponseInterceptor,
  SetServiceApiTimeout
} from "@/openApi/core/OpenAPI";
import HOST from "./HOST";
import { getAppInstance } from "@/main";

let vue = getAppInstance();

function starLoading(vue: Vue | null) {
  // 开始加载
  if (vue)
    vue.$Message.loading({
      content: "加载中",
      duration: 0
    });
}

function endLoading(vue: Vue | null) {
  // 加载结束
  if (vue) vue.$Message.destroy();
}

function resProcessing(res: ResBase, vue: Vue | null) {
  // 自定义业务返回信息判断 处理
  // optResult 0的时候 发起业务成功
  // let data = res.data;

  if (res.optResult !== 0) {
    // 业务失败
    let errMes = res.msg;
    console.log("业务失败", errMes);
    if (vue)
      vue.$Message.error({
        content: errMes,
        duration: 2
      });

    throw new Error("业务失败");
  }
}
//   function resArryProcessing(resArry: ResponseModel[]) {
//     // 自定义业务返回信息数组判断
//     let errMes: string | undefined; // 业务异常信息
//     resArry.forEach((item, index) => {
//       if (item.code === -1) {
//         if (index > 0) {
//           errMes += "/n";
//         }
//         errMes += item.mes;
//       }
//     });
//     if (errMes) {
//       message.error({
//         content: errMes,
//         duration: 2
//       });
//     }
//   }
//  function errProcessing(err: ErrData) {
//     // 异常处理函数
//     console.info("错误", err.error);
//     if (err && err.statusCode === 500) {
//       message.error({
//         content: "请求失败请检查网络",
//         duration: 2
//       });

//     } else if (
//       err.error === ErrorType.UNAUTHORIZED ||
//       err.error === ErrorType.BADREQUEST
//     ) {
//       if (err.message && typeof err.message != "string") {
//         let mes = `<div>`;
//         err.message.map(item => {
//           mes + `<p>${item}</p>`;
//         });
//         mes = mes + `</div>`;
//         Notification.error({
//           title: "错误",
//           message: mes,
//           dangerouslyUseHTMLString: true,
//           duration: 2000
//         });

//         message.error({
//           content: "操作失败！",
//           duration: 2
//         });
//       } else {

//         message.error({
//           content: err.message,
//           duration: 2
//         });

//       }
//     } else {
//       message.error({
//         content: "请求失败没返回",
//         duration: 2
//       });

//     }
//   }

function initRequest() {
  // 初始化request
  let requestNum = 0; //发起请求数
  let loadingDelay = 2; //加载效果延迟
  let loadingTimeout: number | null; //加载定时器id

  OpenAPI.BASE = HOST;

  SetServiceApiTimeout(5);
  AddRequestInterceptor(option => {
    //   请求前拦截
    vue = getAppInstance();
    console.log("请求前拦截", option, vue);
    requestNum++;
    loadingTimeout = setTimeout(() => starLoading(vue), loadingDelay * 1000);
    return { ...option };
  });
  AddResponseInterceptor(res => {
    //   请求返回拦截
    vue = getAppInstance();
    console.log("请求返回拦截", res, vue);
    requestNum--;
    if (requestNum < 1) {
      if (loadingTimeout !== null && loadingTimeout !== -1)
        clearTimeout(loadingTimeout);
      endLoading(vue);
    }
    const result = res.body as ResBase;
    resProcessing(result, vue);
    return res;
  });
}

initRequest();
